from fastapi.testclient import TestClient
from .api import build_tool, DoubanAPI, ComingMovieInfo, PlayingMovieInfo
from typing import List


class DoubanMock(DoubanAPI):
    def __init__(self) -> None:
        pass
    
    def get_coming(self) -> List[ComingMovieInfo]:
        return [
            ComingMovieInfo(date="2020-12-12", title="test1", cate="test1", region="test1", wantWatchPeopleNum="1", link="test1"),
            ComingMovieInfo(date="2021-12-12", title="test2", cate="test2", region="test2", wantWatchPeopleNum="2", link="test2"),
            ComingMovieInfo(date="2022-12-12", title="test3", cate="test3", region="test3", wantWatchPeopleNum="3", link="test3"),
        ]
    
    def get_now_playing(self) -> List[PlayingMovieInfo]:
        return [
            PlayingMovieInfo(title="test1", score="1.1", region="test1", director="test1", actors="test1", link="test1"),
            PlayingMovieInfo(title="test2", score="2.2", region="test2", director="test2", actors="test2", link="test2"),
            PlayingMovieInfo(title="test3", score="3.3", region="test3", director="test3", actors="test3", link="test3"),
        ]

    def get_movie_detail(self, url : str) -> str:
        return url


app = build_tool({"debug": True, "douban_api": DoubanMock()})
client = TestClient(app)

def test_get_coming():
    response = client.get("/coming_out_filter", params={
        "args": "全部, 全部, 2, True"
    })
    assert response.status_code == 200
    assert response.json() == {
        "date": {
            "1": "2021-12-12",
            "0": "2022-12-12",
        },
        "title": {
            "1": "test2",
            "0": "test3",
        },
        "cate": {
            "1": "test2",
            "0": "test3",
        },
        "region": {
            "1": "test2",
            "0": "test3",
        },
        "wantWatchPeopleNum": {
            "1": "2人",
            "0": "3人",
        },
    }

def test_get_playing():
    response = client.get("/now_playing_out_filter", params={
        "args": "全部, 3, False"
    })
    assert response.status_code == 200
    assert response.json() == {
        "title": {
            "0": "test1",
            "1": "test2",
            "2": "test3",
        },
        "score": {
            "0": "1.1",
            "1": "2.2",
            "2": "3.3",
        },
        "region": {
            "0": "test1",
            "1": "test2",
            "2": "test3",
        },
        "director": {
            "0": "test1",
            "1": "test2",
            "2": "test3",
        },
        "actors": {
            "0": "test1",
            "1": "test2",
            "2": "test3",
        },
    }

def test_detail():
    response = client.get("/print_detail", params={
        "args": "test1"
    })
    assert response.status_code == 200
    assert response.json() == "test1test1"
